/**
 *  APM_Installed()
 *  vrati verzi APM v hexa tvaru 0xHHLL (HH.LL)
 */
int APM_Installed() {
  asm mov ax,5300h  ;
  asm xor bx,bx     ;
  asm int 15h       ;
  asm jc  neni_apm  ;
  asm cmp ax, 101h  ;
  asm jc  neni_apm  ;
  asm jmp konec     ;

  neni_apm:
    asm xor ax, ax  ;
    asm jmp konec   ;
  konec:
    asm ret         ;
}

/**
 *  APM_PowerOff()
 *  pokusi se vypnout pocitac pres APM
 */
int APM_PowerOff() {
  asm mov ax,5301h      ;
  asm mov bx,0          ;
  asm int 15h           ;
  asm jc  error         ;
  asm mov ax,5300h      ;
  asm xor bx,bx         ;
  asm int 15h           ;
  asm mov cx, ax        ;
  asm mov ax,530Eh      ;
  asm mov bx,0          ;
  asm int 15h           ;
  asm jc  error         ;
  asm mov ax,530Dh      ;
  asm mov bx,1          ;
  asm mov cx,1          ;
  asm int 15h           ;
  asm jc  error         ;
  asm mov ax,530Fh      ;
  asm mov bx,1          ;
  asm mov cx,1          ;
  asm int 15h           ;
  asm jc  error         ;
  asm mov ax,5307h      ;
  asm mov bx,1          ;
  asm mov cx,3          ;
  asm int 15h           ;
  error:
    asm mov ax, 0FFFFh  ;
  asm ret               ;
}


/**
 *  APM_Reboot()
 *  restartuje pocitac (APM neni zapotrebi)
 */
void APM_Reboot() {
  int temp;
  do {
    temp = __inportb__(0x64);
    if (temp & 1)
      __inportb__(0x60);
  } while (temp & 2);
  __outportb__(0x64, 0xFE);

  return;
}
